// 参考 bilibili写得，非常好
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
const int maxn = 500005;
// 假设字符串由小写字母构成
const int maxz = 26; // 不同字符个数，例如数字10，小写字母26
int trie[maxn][maxz];
// trie[i][j]表示第i个节点的有一个字母‘a’+j 儿子，记录儿子的节点编号
int idx; // 全局，每遇到一个非前缀的新字母，idx；
bool ed[maxn];
int size[maxn]; // 计数器
int ans = 0;    // 计数器

void insertX(string s) { // 将字符串s插入到字典树中
  bool ok = 1;
  int p = 0;
  for (auto &c : s) {
    int ch = c - 'a'; // 转换成数字
    if (!trie[p][ch])
      trie[p][ch] = ++idx; // 记录下标
    p = trie[p][ch];

    if (ed[p]) {
      ok = 0;
      break;
    }
  }

  // 若OK=0;S插入失败
  if (ok) {
    ed[p] = 1;      // 打上标记。后面的字符串就不用插入了。
    ans -= size[p]; // 以前插入的要减去
    int pp = 0;
    for (auto c : s) {
      int ch = c - 'a'; // 转换成数字
      pp = trie[pp][ch];
      size[pp] -= size[p];
    }
  }
}

void insertY(string s) { // 将字符串s插入到字典树中
  bool ok = 1;
  int p = 0;
  for (auto &c : s) {
    int ch = c - 'a'; // 转换成数字
    if (!trie[p][ch])
      trie[p][ch] = ++idx; // 记录下标
    p = trie[p][ch];
    if (ed[p]) {
      ok = 0;
      break;
    }
  }
  if (ok) {
    int p = 0;
    ans++;
    for (auto c : s) {
      int ch = c - 'a'; // 转换成数字
      p = trie[p][ch];
      size[p]++;
    }
  }
}

int main() {

  memset(trie, 0, sizeof(trie));
  memset(ed, 0, sizeof(ed));
  memset(size, 0, sizeof(size));
  idx = 0;
  int q;
  cin >> q;
  for (int i = 0; i < q; i++) {

    int op;
    string s;
    cin >> op >> s;
    if (op == 1) {
      insertX(s);
    } else {
      insertY(s);
    }
    cout << ans << endl;
  }
  return 0;
}